package com.example.controller;

import com.example.config.httpclient.WeChatAccessClient;
import com.example.config.httpclient.WeChatUserClient;
import com.example.pojo.config.WeChatConfig;
import com.example.pojo.entity.Result;
import com.example.pojo.http.resp.WeChatAccessTokenResp;
import com.example.pojo.http.resp.WeChatUserResp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 微信文档: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
 */
@RestController
@RequestMapping("/wechat")
public class WeChatConfigController {
    @Resource
    private WeChatConfig config;
    @Resource
    private WeChatAccessClient accessClient;
    @Resource
    private WeChatUserClient userClient;

    /**
     * 拼接 URL 返回给前端
     * @param infoJson 前端传给后台的一些数据,用于扩展,比如当前所在的页面等
     * @return
     */
    @GetMapping("url")
    public Result getUrl(String infoJson) {
        StringBuilder sb = new StringBuilder();
        /**
         * 构建一个如下的 url
         * https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
         * 微信认证服务器地址: https://open.weixin.qq.com/connect/qrconnect
         * 参数:
         * 参数名称         是否必须    说明
         * appid	        是	      应用唯一标识
         * redirect_uri	    是	      请使用urlEncode对链接进行处理
         * response_type	是	      填code,固定,表示是授权码模式
         * scope	        是	      应用授权作用域，拥有多个作用域用逗号（,）分隔，网页应用目前仅填写snsapi_login
         * state	        否	      用于保持请求和回调的状态，授权请求后原样带回给第三方。该参数可用于防止csrf攻击（跨站请求伪造攻击），建议第三方带上该参数，可设置为简单的随机数加session进行校验
         * lang	            否	      界面语言，支持cn（中文简体）与en（英文），默认为cn
         */

        sb.append(config.getAuthUrl()).append("?")
                .append("appid").append("=").append(config.getAppId()).append("&")
                .append("redirect_uri").append("=").append(config.getRedirectUri()).append("&")
                .append("response_type").append("=").append("code").append("&")
                .append("scope").append("=").append("snsapi_login").append("&")
                .append("state").append("=").append(infoJson).append("&")
                .append("lang").append("=").append("cn");
        String url = sb.toString();

        System.out.println("url = " + url);
        Result result = new Result();
        result.setCode(200);
        result.setMsg("success");
        result.setData(url);
        return result;
    }

    /**
     * 获得 微信授权后重定向的接口
     * 获得 code信息
     * @return
     */
    @GetMapping("code")
    public Result getCode(String code,String state) {
        System.out.println("code = " + code);
        System.out.println("state = " + state);

        //请求 accessToken
        WeChatAccessTokenResp accessToken = accessClient.getAccessToken(code, state);
        System.out.println("accessToken = " + accessToken);
        // todo 保存至数据库

        //请求 用户信息
        WeChatUserResp userInfo = userClient.getGrantUserInfo(accessToken.getAccess_token(), accessToken.getOpenid());
        System.out.println("userInfo = " + userInfo);
        //todo 保存用户信息至数据库

        Result result = new Result();
        result.setCode(200);
        result.setMsg("success");
        result.setData(userInfo);
        return result;
    }
}